import random

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time

from selenium.webdriver.support.wait import WebDriverWait


# 配置连接已启动的 Edge 浏览器
def connect_to_edge():
    options = Options()
    options.debugger_address = "127.0.0.1:9222"  # 连接到指定的调试端口

    # 使用 Selenium 连接到已启动的浏览器
    driver = webdriver.Edge(options=options)
    return driver

# 抓取页面内容
def scrape_data(driver):
    print("✅ 已成功连接到 Edge 浏览器！")
    input("🧑 请完成搜索后，按回车键开始抓取数据...")

    # 模拟一些人类行为，例如滚动页面
    print("🕹 模拟用户行为：滚动页面...")
    for _ in range(3):  # 滚动页面 3 次
        driver.execute_script("window.scrollBy(0, 1000);")
        time.sleep(2)

    # 获取搜索结果并提取标题和链接
    try:
        detail_link_selector = 'a[data-ta="summary-record-title-link"]'
        detail_link_elements = driver.find_elements(By.CSS_SELECTOR, detail_link_selector)

        # 提取详情页URL（注意：列表页的href是相对路径，需拼接Web of Science域名）
        base_url = "https://www.webofscience.com"
        detail_urls = [
            base_url + elem.get_attribute("href")
            for elem in detail_link_elements
        ]

        # ---------------------- 步骤3：用户输入爬取数量，控制爬取范围 ----------------------
        n = int(input("请输入要爬取的论文数量："))
        selected_urls = detail_urls[:n]  # 取前n个链接

        # ---------------------- 步骤4：遍历打开详情页（后续补充详情页解析） ----------------------
        for idx, url in enumerate(selected_urls, start=1):
            try:
                # 打开详情页
                driver.get(url)

                # 等待详情页加载完成（示例：等待“标题”元素出现，可根据实际调整）
                wait = WebDriverWait(driver, 10)  # 最长等待10秒
                wait.until(
                    EC.presence_of_element_located((By.CSS_SELECTOR, "h1.title"))  # 假设详情页标题是<h1 class="title">
                )

                # ---------------------- 后续补充：解析详情页数据 ----------------------
                # 此处预留“详情页解析函数”，需结合详情页HTML结构编写（如提取标题、作者、摘要等）
                # 示例伪代码：parse_detail_page(driver)

                print(f"✅ 第{idx}篇论文详情页已加载：{url}")
                time.sleep(random.uniform(1.5, 3.0))  # 适度等待，避免请求过于频繁（可删除或调整）

            except Exception as e:
                print(f"❌ 第{idx}篇论文处理失败：{url}，错误：{str(e)}")
                continue  # 跳过失败项，继续下一个
    except Exception as e:
        print(f"⚠️ 抓取失败: {e}")

# 主程序
if __name__ == "__main__":
    print("🚀 启动 Edge 浏览器并连接...")
    driver = connect_to_edge()
    scrape_data(driver)
    driver.quit()
